import React, { Fragment } from 'react';
import propTypes from 'prop-types';
import styled from 'styled-jss';
import Card from '../Card';
import Icon from '../Icon';
import Button from '../Button';
import CardBody from '../CardBody';
import CardHeader from '../CardHeader';
import CardFooter from '../CardFooter';
const ICON_MAP = {
  info: "fa-info-circle",
  success: "fa-check-circle",
  warning: "fa-exclamation-circle",
  danger: "fa-exclamation-triangle",
};
const footerStyle = {
    display: 'flex',
    justifyContent: 'space-between',
}
const getIconColor = (theme) => ({
  info: theme.colors.info,
  success: theme.colors.success,
  danger: theme.colors.danger,
  warning: theme.colors.warning,
});
const StyledIcon = styled(Icon)(({ theme, type }) => ({
  fontSize: 60,
  display: 'block',
  textAlign: 'center',
  marginBottom: theme.getSpacing(1),
  color: getIconColor(theme)[type],
}));
const StyledMask = styled('div')({
    top: 0,
    left: 0,
    width: '100vw',
    height: '100vh',
    zIndex: 1000,
    display: 'flex',
    position: 'fixed',
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: 'rgba(0, 0, 0, 0.5)'
});
const StyledDialog = styled('div')({
    position: 'relative'
});
const Alert = ({ open, title, subtitle, type, children, cancelText, confirmText, onConfirm, onCancel, ...props }) => {
    if (!open) return <Fragment />;
    return (
        <StyledMask>
            <StyledDialog>
                <Card>
                    <CardBody>
                        <StyledIcon type={type} icon={ICON_MAP[type]} />
                        {children}
                    </CardBody>
                    <CardFooter style={footerStyle}>
                        <Button type='text' onClick={onCancel}>{cancelText}</Button>
                        <Button type='filled' onClick={onConfirm}>{confirmText}</Button>
                    </CardFooter>
                </Card>
            </StyledDialog>
        </StyledMask>
    )
}
Alert.propTypes = {
    open: propTypes.bool,
    title: propTypes.string,
    subtitle: propTypes.string,
    confirmText: propTypes.string,
    cancelText: propTypes.string,
    onConfirm: propTypes.func,
    onCancel: propTypes.func,
    onEnter: propTypes.func,
    onExited: propTypes.func,
}
Alert.defaultProps = {
    open: true,
    title: '',
    subtitle: '',
    confirmText: '確認',
    cancelText: '取消',
    onConfirm: () => false,
    onCancel: () => false,
    onEnter: () => false,
    onExited: () => false,
}
export default Alert;
import React, { Fragment, useState } from "react";
import theme from "../../lib/theme";
import Alert from "../../lib/Alert";
import Button from "../../lib/Button";
import ThemeProvider from "../../lib/ThemeProvider";
const Provider = (props) => {
    return <ThemeProvider theme={theme}>{props.children}</ThemeProvider>;
};
const Template = args => {
    const [open, setOpen] = useState(false);
    return (
        <Provider>
            <Fragment>
                <Alert
                  open={open}
                  type='info'
                  onCancel={() => setOpen(false)}
                  onConfirm={() => setOpen(false)}>
                    顯示信息彈窗的內容..
                </Alert>
                <Button onClick={() => setOpen(true)}>Open Alert</Button>
            </Fragment>
        </Provider>
    );
}
export const Default = Template.bind({});
export default {
    component: Alert,
    title: "Components/Alert",
};
結果如下:
